//
// Created by francklinson on 2021/8/21 AT 9:32.
//
// 给你一个字符数组 chars ，请使用下述算法压缩：
//
//从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 ：
//
//如果这一组长度为 1 ，则将字符追加到 s 中。
//否则，需要向 s 追加字符，后跟这一组的长度。
//压缩后得到的字符串 s 不应该直接返回 ，需要转储到字符数组 chars 中。需要注意的是，如果组长度为 10 或 10 以上，则在 chars 数组中会被拆分为多个字符。
//
//请在 修改完输入数组后 ，返回该数组的新长度。
//
//你必须设计并实现一个只使用常量额外空间的算法来解决此问题。
//
//来源：力扣（LeetCode）
//链接：https://leetcode-cn.com/problems/string-compression
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <algorithm>
#include <functional>
#include <climits>

using namespace std;

class Solution {
public:
    int compress(vector<char> &chars) {
        int n = (int) chars.size();
        int left = 0, index = 0; // 在index处新增，left是一段的起点
        for (int right = 0; right < n; ++right) {
            // 遇到一段的结尾
            if (right == n - 1 or chars[right] != chars[right + 1]) {
                chars[index] = chars[left];
                ++index;
                if (right > left) { // 排除长度为1
                    int length = right - left + 1;
                    auto lenStr = to_string(length);
                    for (char k : lenStr) {
                        chars[index] = k;
                        ++index;
                    }
                }
                left = right + 1;
            }
        }
        return index;
    }
};

int main() {
    vector<char> chars{'a', 'a', 'b', 'b', 'c', 'c', 'c'};
    Solution solution;
    cout << solution.compress(chars) << endl;
    return 0;
}

